﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Infrastucture.Misc;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Models;

namespace GigaSite.Web.Areas.ControlPanel.Controllers
{
    public class ManageAdvsController : BaseRootController
    {
        //
        // GET: /ControlPanel/ManageAdvs/
        /// <summary>
        /// Контроллер для менеджмента объявлений
        /// </summary>
        /// <returns>Страница менеджмента объявлений</returns>
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// Отправляет на клиент объявления согласно указанному фильтру
        /// </summary>
        /// <param name="filter">Фильтры</param>
        /// <returns>Коллекция объявлений в JSON формате</returns>
        [HttpPost]
        public JsonResult GetAdvs(string filter)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<IAdvsRepository>();

                // Получаем коллекцию на основании присланного фильтра
                IEnumerable<Adv> dbAdvs = Enumerable.Empty<Adv>();
                switch (filter)
                {
                    case "moderated":
                        dbAdvs = repository.Search(a => a.Status == AdvStatuses.Checking);
                        break;
                    case "blocked":
                        dbAdvs = repository.Search(a => a.Status == AdvStatuses.Blocked);
                        break;
                    case "archive":
                        dbAdvs = repository.Search(a => a.Status == AdvStatuses.Archive);
                        break;
                    default:
                        dbAdvs = repository.FindAll();
                        break;
                }

                // Преобразуем в коллекцию моделей
                var advs = dbAdvs.Select(a => new AdvModel(a));

                // Отдаем результат
                return JsonSuccess(advs);
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Возвращает список категорий в которой может быть размещено объявление
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public JsonResult GetAdvsCategories()
        {
            try
            {
                // Репозиторий
                var categoriesRepository = Locator.GetService<ICategoriesRepository>();

                // Строим список доступных категорий
                var rootAdsCategory = categoriesRepository.Load(27);
                IList<Category> allChildCategories = new List<Category>();
                rootAdsCategory.GetAllChildCategories(ref allChildCategories);

                // Преобразуем категории в линейный список
                var categories = allChildCategories.OrderBy(c => c.DisplayName).Select(c => new
                                                                    {
                                                                        id = c.Id,
                                                                        name = String.Format("{0}{1}",StringUtils.GenerateString('-',c.GetParentCategories().Count()),c.DisplayName)
                                                                    });
                // Отдаем преобразованный результат
                return JsonSuccess(categories);
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Обрабатывает создание или сохранение объявления через админку
        /// </summary>
        /// <param name="id">Идентификатор объявления</param>
        /// <param name="title">Заголовок</param>
        /// <param name="content">содержимое</param>
        /// <param name="tags">Ключевые слова</param>
        /// <param name="category">Идентификатор категории</param>
        /// <param name="phone">Телефон</param>
        /// <param name="email">Email</param>
        /// <param name="status">Статус объявления</param>
        /// <param name="sticked">Объявление прилеплено</param>
        /// <param name="new">Объявление новое</param>
        /// <param name="hot">Объяление горячее</param>
        /// <param name="expirationDate">Дата истечения объявления и помещения его в архив</param>
        /// <returns>Все ок или ошибка</returns>
        [HttpPost]
        public JsonResult Save(long id, string title, string content, string tags, long category, string phone, string email, short status, bool sticked, bool @new, bool hot, DateTime? expirationDate)
        {
            try
            {
                // Репозиторий
                var advsRepository = Locator.GetService<IAdvsRepository>();

                // В зависимости от идентификатора либо сохраняем либо создаем
                Adv adv = null;
                if (id <= 0)
                {
                    adv = new Adv()
                              {
                                  CategoryId = category,
                                  CityId = 1,
                                  // TODO: пока все в Хабаровске
                                  DateCreated = DateTime.Now,
                                  Content = content,
                                  Title = title,
                                  Email = email,
                                  ExpirationDate = expirationDate,
                                  Hot = hot,
                                  New = @new,
                                  Phones = phone,
                                  Status = AdvStatuses.Active,
                                  Sticked = sticked,
                                  Tags = tags,
                                  UserId = 1,
                                  // TODO: самый первый административный юзверь
                                  Views = 0,
                              };
                    advsRepository.Add(adv);
                }
                else
                {
                    // Ищем объявление
                    adv = advsRepository.Load(id);
                    if (adv == null)
                    {
                        throw new ObjectNotFoundException(String.Format("Объявление с номером {0} не найдено",id));
                    }

                    // Применяем изменения
                    adv.DateModified = DateTime.Now;
                    adv.CategoryId = category;
                    adv.CityId = 1; // TODO: пока все только в Хабаровске
                    adv.Title = title;
                    adv.Content = content;
                    adv.Tags = tags;
                    adv.Status = (AdvStatuses) status;
                    adv.Phones = phone;
                    adv.Email = email;
                    adv.Sticked = sticked;
                    adv.New = @new;
                    adv.Hot = hot;
                    adv.ExpirationDate = expirationDate;
                }

                // Сохраняем
                 advsRepository.SubmitChanges();

                // Отдаем успешный результат выполнения операции
                return JsonSuccess(new
                                       {
                                           id = adv.Id
                                       });
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Удаляет объявление из системы
        /// </summary>
        /// <param name="id">Идентификатор объявления</param>
        /// <returns>все ок или ошибка</returns>
        [HttpPost]
        public JsonResult Delete(long id)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<IAdvsRepository>();

                // Ищем объявление
                var adv = repository.Load(id);
                if (adv == null)
                {
                    throw new ObjectNotFoundException(String.Format("Объявление с номером {0} не найдено", id));
                }

                // Удаляем
                repository.Delete(adv);
                repository.SubmitChanges();

                // Отдаем результат
                return JsonSuccess();
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }
    }
}
